package com.tarena.lbs.basic.service.impl;

import com.tarena.lbs.basic.dao.mapper.AreaMapper;
import com.tarena.lbs.basic.dao.repository.AreaRepository;
import com.tarena.lbs.basic.pojo.po.AreaPO;
import com.tarena.lbs.basic.pojo.vo.AreaVO;
import com.tarena.lbs.basic.service.AreaService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

@Slf4j
@Service
public class AreaServiceImpl implements AreaService {
    @Autowired
    // 区域仓库，用于操作区域相关的数据
    private AreaRepository areaRepository;

    /**
     * 查询所有省份
     *
     * @return 省份列表
     */
    @Override
    public List<AreaVO> queryProvinces() {
        // 从数据库中查询所有省份
        List<AreaPO> areaPOs = areaRepository.queryProvinces();
        // 将省份实体列表转换为视图对象列表
        return areaPOs.stream().map(this::poToVo).collect(Collectors.toList());
    }

    /**
     * 根据父级ID查询子区域
     *
     * @param parentId 父级区域ID
     * @return 子区域列表
     */
    @Override
    public List<AreaVO> queryChildren(Long parentId) {
        // 从数据库中查询指定父级ID的子区域
        List<AreaPO> areaPOs = areaRepository.queryChildren(parentId);
        // 将子区域实体列表转换为视图对象列表
        return areaPOs.stream().map(this::poToVo).collect(Collectors.toList());
    }

    /**
     * 获取区域树结构
     *
     * @return 区域树结构列表
     */
    @Override
    public List<AreaVO> tree() {
        // 查询所有区域
        List<AreaPO> all = areaRepository.queryAll();
        // 构建树结构
        List<AreaVO> roots = all.stream()
                .filter(po -> po.getParentId() == 0)
                .map(this::poToVo)
                .collect(Collectors.toList());
        for (AreaVO root : roots) {
            // 递归设置每个根区域的子区域
            root.setChildren(getChildren(root.getId(), all));
        }
        return roots;
    }

    /**
     * 递归获取子区域
     *
     * @param parentId 父级区域ID
     * @param all      所有区域列表
     * @return 子区域列表
     */
    private List<AreaVO> getChildren(Long parentId, List<AreaPO> all) {
        List<AreaVO> children = new ArrayList<>();
        for (AreaPO po : all) {
            if (po.getParentId().equals(parentId)) {
                // 将符合条件的子区域转换为视图对象，并递归设置其子区域
                AreaVO vo = poToVo(po);
                vo.setChildren(getChildren(vo.getId(), all));
                children.add(vo);
            }
        }
        return children;
    }

    /**
     * 将区域实体转换为视图对象
     *
     * @param po 区域实体
     * @return 区域视图对象
     */
    private AreaVO poToVo(AreaPO po) {
        AreaVO vo = new AreaVO();
        vo.setId(po.getId());
        vo.setName(po.getName());
        vo.setParentId(po.getParentId());
        return vo;
    }

}
